/**
 * 
 */
package mm.back.dao.impl;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;

import genericos.dao.exeptions.PersistanceException;
import genericos.dao.exeptions.PersistenceServiceException;
import mm.back.dao.MMAbstractDAO;
import mm.back.dao.VentasDAO;
import mm.back.entity.DetalleVenta;
import mm.back.entity.Venta;
import mm.back.filtros.VentasFiltro;
import mm.exceptions.MMGenericException;

/**
 * @author PUSDERKIS
 *
 */
public class VentasDAOImpl extends MMAbstractDAO implements VentasDAO {

	/** 
	 * @see mm.back.dao.VentasDAO#saveVenta(mm.back.entity.Venta)
	 */
	public void saveVenta(Venta venta) throws MMGenericException {
		
		
		try{
			if (logger.isDebugEnabled()){
				logger.debug("Se intenta guardar el la venta...");
			}

			universalHibernateDAO.getHibernateSession().persist(venta);
			
			if(logger.isDebugEnabled()){
				logger.debug("Venta guardado correctamente. ID: "+venta.getId());
			}
			
		} catch (PersistenceServiceException e) {
			logger.error("Fallo al guardar la venta en la base de datos.",e);
			throw new MMGenericException(e.getMessage(),e);
		} catch (HibernateException e) {
			logger.error("Fallo al guardar la venta en la base de datos.",e);
			throw new MMGenericException(e.getMessage(),e);
		} catch (PersistanceException e) {
			logger.error("Fallo al guardar la venta en la base de datos.",e);
			throw new MMGenericException(e.getMessage(),e);
		}

	}

	/** 
	 * @see mm.back.dao.VentasDAO#buscarVentas(mm.back.filtros.VentasFiltro)
	 */
	@SuppressWarnings("unchecked")
	public List<Venta> buscarVentas(VentasFiltro filtro) {
		
		StringBuffer sQuery = new StringBuffer();
		
		sQuery.append("FROM Venta v WHERE 1=1 ");
		sQuery.append(filtro.getWhereClause("v"));
		
		sQuery.append(" ORDER BY v.id DESC");
		List<Venta> ventas;
		
		try{
			if (logger.isDebugEnabled()){
				logger.debug("Se intenta recuperar el listado de ventas...");
			}

			Query query = universalHibernateDAO.getHibernateSession().createQuery(sQuery.toString());
			
			filtro.setWhereParameters(query);
			
			ventas = query.list();
			if(logger.isDebugEnabled()){
				logger.debug("Se recuperaron "+ ventas.size() + " ventas.");
			}
			
		} catch (PersistenceServiceException e) {
			logger.error("Ocurrio un error al recuperar la lista de ventas.",e);
			throw new MMGenericException(e.getMessage(),e);
		} catch (HibernateException e) {
			logger.error("Ocurrio un error al recuperar la lista de ventas.",e);
			throw new MMGenericException(e.getMessage(),e);
		} catch (PersistanceException e) {
			logger.error("Ocurrio un error al recuperar la lista de ventas.",e);
			throw new MMGenericException(e.getMessage(),e);
		}
		return ventas;

	}

	/** 
	 * @see mm.back.dao.VentasDAO#buscarVenta(java.lang.Long)
	 */
	public Venta buscarVenta(Long idVenta) {
		return (Venta) universalHibernateDAO.get(Venta.class, idVenta);
	}

	/**
	 * @see mm.back.dao.VentasDAO#updateDetalle(mm.back.entity.DetalleVenta)
	 */
	public void updateDetalle(DetalleVenta dv) throws MMGenericException {

		try{
			if (logger.isDebugEnabled()){
				logger.debug("Se intenta actualizar el detalle de la venta número: "+dv.getId());
			}
			
			universalHibernateDAO.saveOrUpdate(dv);
			
		} catch (PersistenceServiceException e) {
			logger.error("Ocurrio un error actualizar el detalle número: "+dv.getId(),e);
			throw new MMGenericException(e.getMessage(),e);
		} catch (HibernateException e) {
			logger.error("Ocurrio un error actualizar el detalle número: "+dv.getId(),e);
			throw new MMGenericException(e.getMessage(),e);
		}
		
	}

	/**
	 * @see mm.back.dao.VentasDAO#deleteDetalleVenta(java.lang.Long)
	 */
	public void deleteDetalleVenta(Long idDetalle) throws MMGenericException {
		
		try{
			if (logger.isDebugEnabled()){
				logger.debug("Se intenta actualizar el detalle de la venta número: "+idDetalle);
			}
			
			DetalleVenta dv = (DetalleVenta) universalHibernateDAO.load(DetalleVenta.class, idDetalle);
			universalHibernateDAO.getHibernateSession().delete(dv);
			
		} catch (PersistenceServiceException e) {
			logger.error("Ocurrio un error borrar el detalle número: "+idDetalle,e);
			throw new MMGenericException(e.getMessage(),e);
		} catch (HibernateException e) {
			logger.error("Ocurrio un error actualizar el detalle número: "+idDetalle,e);
			throw new MMGenericException(e.getMessage(),e);
		} catch (PersistanceException e) {
			logger.error("Ocurrio un error actualizar el detalle número: "+idDetalle,e);
			throw new MMGenericException(e.getMessage(),e);
		}
		
	}

}
